In fact, the identifier of the array is itself treated as a pointer to the zeroth element of the array (remember array indexing begins with 0). The following are equivalent:
f_array and &f_array[0]
f_array+1 and &f_array[1]
*(f_array+1) and f_array[1]
That is, the syntax: name[i] is treated the same as: *(name+i) in C. If f_ptr contains the address of f_array[5], then the following are equivalent:
f_ptr[1] and f_array[6]
However, an important distinction between an array identifier and a true pointer variable is that the former is a constant address, and cannot have a new value assigned to it:
f_array = f_ptr; /* disallowed, since f_array is a pointer constant, not variable */